home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
t2b01
/
t2b01s.lzh
/
TIM2BMP.S
< prev
next >
Wrap
Text File
|
1997-09-08
|
34KB
|
1,517 lines
*********************************************************************************
* TIM to BMP converter <TIM2BMP.X Ver0.01> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
TIM_SU equ 1000 *ファイル中に隠れているTIMの最大数
tim_grsize equ 0
tim_yoko equ 8
tim_tate equ 10
file_header:
f_type: equ 0 *ファイル識別子 'BM'
f_size: equ 2 *ファイルのサイズ
f_reserved1: equ 6 *予備1
f_reserved2: equ 8 *予備2
f_offbits: equ 10 *ファイル先頭からイメージデータへのオフセット
WIN3_HED:
win3_size: equ 14 *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
win3_width: equ 18 *横サイズ
win3_height: equ 22 *縦サイズ
win3_planes: equ 26 *使用プレーン数
win3_bitcount: equ 28 *色数 (1:2色,4:16色,8:256色,24:16777216色)
win3_comp: equ 30 *圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
win3_size_image equ 34 *イメージデータのサイズ
win3_xpels_pm: equ 38 *X方向のディスプレイ分解能
win3_ypels_pm: equ 42 *Y方向のディスプレイ分解能
win3_clr_used: equ 46 *色変換テーブルの大きさ
win3_clr_imp: equ 50 *重要な色の数
.text
.even
start:
lea.l mysp(pc),sp *スタックセット
lea.l work(pc),a6
lea.l 16(a0),a0 *余分なメモリ開放
suba.l a0,a1
move.l a1,-(sp)
move.l a0,-(sp)
DOS _SETBLOCK
addq.l #8,sp
bsr cmdchk *コマンドラインの解析
bsr s_name_chk *セーブファイル名のチェック
bsr buf_get *バッファ確保
bsr name_get *ファイル名を取得し処理する
bsr buf_free *バッファ開放
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg1(a6) *
pea.l filbuf(a6) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
pea.l filbuf(a6) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(a6) *ファイル名を展開する
pea.l arg1(a6) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi name_er * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg1(a6),a0 *バッファargに
lea.l nambuf(a6),a1 * nameckで展開したパス名+'*.GLX'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg1(a6) * 検索してみる
pea.l filbuf(a6) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg1(a6),a0 *バッファarg1に
lea.l komekome(pc),a1 * もとのファイル名+'\*.GLX'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* 出力パス名をチェックする *
*****************************************************************
s_name_chk:
lea.l arg2(a6),a0 *出力パス名を指定したか?
tst.b (a0)
beq s_name_chk8 *してない
pea.l nambuf(a6) *ファイル名を展開する
pea.l arg2(a6) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi out_name_err * パス名の指定に誤りがある
beq s_name_chk1 *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne out_name_err * ワイルドカード指定あり
s_name_chk1:
lea.l arg2(a6),a0 *ドライブ名を指定しているか?
cmp.b #':',1(a0)
bne out_name_err *ドライブ名の指定に誤りがある
tst.b 2(a0) *ドライブ名のみか
bne s_name_chk2 *違う
addq.l #2,a0
bra s_name_chk9
s_name_chk2:
moveq.l #0,d0 *セーブ先ドライブ番号を求める
move.b (a0),d0
bsr toupper
sub.b #'A',d0
add.b #1,d0
lea.l spathbuf(a6),a1 *セーブ先ドライブ名
move.b (a0),(a1)+
move.b #':',(a1)+
move.b #'\',(a1)+
move.l a1,-(sp) *セーブ先パスをセーブ
move.w d0,-(sp)
DOS _CURDIR
addq.l #6,sp
lea.l cpathbuf(a6),a2 *カレントパスをセーブしておく
DOS _CURDRV
add.b #"A",d0
move.b d0,(a2)+
move.b #':',(a2)+
move.b #'\',(a2)+
move.l a2,-(sp)
move.w #0,-(sp)
DOS _CURDIR
addq.l #6,sp
pea.l arg2(a6) *コマンドラインで指定されたパスへ
DOS _CHDIR * 移動してみる
addq.l #4,sp
tst.l d0 *d0が0でなければ
bmi out_name_err * パス名の指定に誤りがある
pea.l spathbuf(a6) *セーブ先パスを戻す
DOS _CHDIR
addq.l #4,sp
pea.l cpathbuf(a6) *カレントパスに戻す
DOS _CHDIR
addq.l #4,sp
lea.l arg2(a6),a0 *
bsr set_en *パス名の最後に\マークをセット
bra s_name_chk9
s_name_chk8:
lea.l arg2(a6),a0
s_name_chk9:
move.l a0,nameichi(a6)
rts
*****************************************************************
* パス名に¥マークを連結する *
*****************************************************************
set_en:
tst.b (a0)+ *(a0)は0か?
bne set_en *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
cmp.b #"\",-1(a0) *一番最後の文字が¥か
beq set_en_ * ¥ならばスキップ
move.b #'\',(a0)+ * ¥をセット
set_en_:
rts
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg1以降に格納する *
*****************************************************************
setpath:
lea.l arg1(a6),a0 *a0=コピー先
lea.l nambuf(a6),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(a6),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg1(a6),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #".",(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg1(a6),a0 *a0=引数切り出し領域
clr.b 256(a0) *出力ファイル名をちょっと初期化
addq.l #1,a2 *a2=コマンドライン文字列先頭
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
lea.l 256(a0),a0 *a0=a0+256
bsr switch_chk *さらにスイッチのチェック
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
bra usage *無効なスイッチが指定された
switch_chk2:
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
lea.l arg1(a6),a0 *ファイル名セット
bsr file_open *ファイルオープン
bsr file_size *ファイルサイズを調べる
move.l d6,fi_size(a6)
cmp.l buff_size(a6),d6 *メモリがあるか
bhi main9
bsr kensaku_prt *'検索中'表示
movea.l buff_addr(a6),a5 *読み込む
bsr file_read
move.w in_file(a6),-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
move.l buff_addr(a6),d0 *変換後アドレス
add.l fi_size(a6),d0
move.l d0,gr_addr2(a6)
clr.w file_cnt(a6)
clr.w edaban(a6)
bsr save_name_set *書き込むファイル名作成
bsr search *サーチ
bsr file_cnt_chk *処理したファイル数のチェック
rts
main9:
move.w in_file(a6),-(sp) *メモリが全然足りない(;_;
DOS _CLOSE
addq.l #2,sp
bsr no_buff
rts
*****************************************************************
* サーチ *
*****************************************************************
search:
movea.l buff_addr(a6),a2 *検索開始アドレス
movea.l a2,a3 *検索終了アドレス(少し減らしておく)
adda.l fi_size(a6),a3
lea.l -20(a3),a3
search0:
sf skip_flg(a6)
search1:
cmp.l a3,a2
bcc search9
cmp.l #$10000000,(a2)+
bne search1
move.l (a2)+,d0 *色数チェック
cmp.l #$0200_0000,d0 *32768colorのデータ
beq search_32k
cmp.l #$0900_0000,d0 *256colorのデータ
beq search_256
cmp.l #$0800_0000,d0 *16colorのデータ
bne search1
search_16:
bsr conv16
bra search0
search_256:
bsr conv256
bra search0
search_32k:
bsr conv32k
bra search0
search9:
rts
*****************************************************************
* 16色データの変換 *
*****************************************************************
conv16:
subq.l #8,a2
move.l 8(a2),d0
bsr i_to_m
addq.w #8,d0
movea.l a2,a0
adda.l d0,a0
move.l tim_grsize(a0),d0 *TIMデータの大きさ求める
bsr i_to_m
add.l #52,d0
move.l d0,tim_size(a6)
move.w tim_yoko(a0),d0 *横ドット数求める
rol.w #8,d0 *横ドット数には4倍した値をセットする
add.w d0,d0
add.w d0,d0
move.w d0,yoko(a6)
move.w tim_tate(a0),d0 *縦ドット数求める
rol.w #8,d0
move.w d0,tate(a6)
lea.l 20(a2),a0 *パレットデータの先頭
move.l a0,pal_addr(a6)
lea.l 64(a2),a0 *グラフィックデータの先頭
move.l a0,gr_addr1(a6)
bsr setdec *ファイル名作成
move.w #4,iro(a6)
move.l #4*16+54,head_size(a6)
bsr line_byte_set
bsr mem_chk *メモリチェック
bsr name_prt *ファイル名とサイズ表示
tst.b skip_flg(a6)
bne conv16_
bsr head_create
moveq.l #16,d0 *パレット変換
bsr pal_set
moveq.l #16*4,d0 *パレットセーブ
bsr pal_save
bsr conv16_0
movea.l gr_addr2(a6),a5
move.w tate(a6),d6
mulu.w line_byte(a6),d6
bsr file_write
addq.w #1,file_cnt(a6)
conv16_:
move.w out_file(a6),-(sp)
DOS _CLOSE
addq.l #2,sp
rts
conv16_0:
move.l gr_addr1(a6),a2
move.l gr_addr2(a6),a1
move.w tate(a6),d0
subq.w #1,d0
mulu.w line_byte(a6),d0
adda.l d0,a1
movea.w line_byte(a6),a4
adda.l a4,a4
move.w yoko(a6),d1 *半端分求める
addq.w #1,d1
lsr.w #1,d1
move.w line_byte(a6),d0
sub.w d1,d0
movea.w d0,a5
move.w yoko(a6),d0 *横ループ
addq.w #1,d0
lsr.w #1,d0
move.w tate(a6),d2 *縦ループ
subq.w #1,d0
subq.w #1,d2
conv16_1:
move.w d0,d1
conv16_2:
move.b (a2)+,d3
ror.b #4,d3
move.b d3,(a1)+
dbra.w d1,conv16_2
move.w a5,d1 *半端分クリア
beq conv16_4
subq.w #1,d1
conv16_3:
clr.b (a1)+
dbra.w d1,conv16_3
conv16_4:
suba.l a4,a1
dbra.w d2,conv16_1
rts
*****************************************************************
* 256色データの変換 *
*****************************************************************
conv256:
subq.l #8,a2
move.l 8(a2),d0
bsr i_to_m
addq.w #8,d0
movea.l a2,a0
adda.l d0,a0
move.l tim_grsize(a0),d0 *TIMデータの大きさ求める
bsr i_to_m
add.l #532,d0
move.l d0,tim_size(a6)
move.w tim_yoko(a0),d0 *横ドット数求める
rol.w #8,d0
add.w d0,d0 *横ドット数には2倍した値をセットする
move.w d0,yoko(a6)
move.w tim_tate(a0),d0 *縦ドット数求める
rol.w #8,d0
move.w d0,tate(a6)
lea.l 20(a2),a0 *パレットデータの先頭
move.l a0,pal_addr(a6)
lea.l 544(a2),a0 *グラフィックデータの先頭
move.l a0,gr_addr1(a6)
bsr setdec *ファイル名作成
move.w #8,iro(a6)
move.l #4*256+54,head_size(a6)
bsr line_byte_set
bsr mem_chk *メモリチェック
bsr name_prt *ファイル名とサイズ表示
tst.b skip_flg(a6)
bne conv256_
bsr head_create
move.w #256,d0 *パレット変換
bsr pal_set
move.l #256*4,d0 *パレットセーブ
bsr pal_save
bsr conv256_0
movea.l gr_addr2(a6),a5
move.w tate(a6),d6
mulu.w line_byte(a6),d6
bsr file_write
addq.w #1,file_cnt(a6)
conv256_:
move.w out_file(a6),-(sp)
DOS _CLOSE
addq.l #2,sp
rts
conv256_0:
move.l gr_addr1(a6),a2
move.l gr_addr2(a6),a1
move.w tate(a6),d0
subq.w #1,d0
mulu.w line_byte(a6),d0
adda.l d0,a1
movea.w line_byte(a6),a4
adda.l a4,a4
move.w line_byte(a6),d0 *半端分求める
sub.w yoko(a6),d0
movea.w d0,a5
move.w yoko(a6),d0 *横ループ
move.w tate(a6),d2 *縦ループ
subq.w #1,d0
subq.w #1,d2
conv256_1:
move.w d0,d1
conv256_2:
move.b (a2)+,(a1)+
dbra d1,conv256_2
move.w a5,d1 *半端分クリア
beq conv256_4
subq.w #1,d1
conv256_3:
clr.b (a1)+
dbra.w d1,conv256_3
conv256_4:
suba.l a4,a1
dbra d2,conv256_1
rts
*****************************************************************
* 32k色データの変換 *
*****************************************************************
conv32k:
subq.l #8,a2
lea.l 8(a2),a0 *先頭
move.l tim_grsize(a0),d0 *TIMデータの大きさ求める
bsr i_to_m
addq.l #8,d0
move.l d0,tim_size(a6)
move.w tim_yoko(a0),d0 *横ドット数求める
rol.w #8,d0
move.w d0,yoko(a6)
move.w tim_tate(a0),d0 *縦ドット数求める
rol.w #8,d0
move.w d0,tate(a6)
lea.l 20(a2),a0 *グラフィックデータの先頭
move.l a0,gr_addr1(a6)
bsr setdec *ファイル名作成
move.w #24,iro(a6)
move.l #0+54,head_size(a6)
bsr line_byte_set
bsr mem_chk *メモリチェック
bsr name_prt *ファイル名とサイズ表示
tst.b skip_flg(a6)
bne conv32k_
bsr head_create
bsr conv32k_0
movea.l gr_addr2(a6),a5
move.w tate(a6),d6
mulu.w line_byte(a6),d6
bsr file_write
addq.w #1,file_cnt(a6)
conv32k_:
move.w out_file(a6),-(sp)
DOS _CLOSE
addq.l #2,sp
rts
conv32k_0:
movea.l gr_addr1(a6),a2 *変換元
movea.l gr_addr2(a6),a1 *変換先
move.w tate(a6),d0
subq.w #1,d0
mulu.w line_byte(a6),d0
adda.l d0,a1
movea.w line_byte(a6),a4
adda.l a4,a4
move.w yoko(a6),d0 *半端分求める
move.w d0,d1
add.w d1,d1
add.w d0,d1
move.w line_byte(a6),d0
sub.w d1,d0
movea.w d0,a5
move.w tate(a6),d0 *縦ループ
subq.w #1,d0
move.w #%00000000_01111100,d4 *マスクデータB
move.w #%11100000_00000011,d5 * G
move.w #%00011111_00000000,d6 * R
move.w #%00000000_00000111,d7
conv32k_1:
move.w yoko(a6),d1 *横ループ
subq.w #1,d1
conv32k_2:
move.w (a2)+,d2
move.w d2,d3 *B
and.w d4,d3
rol.w #1,d3
beq conv32k_3
or.w d7,d3
conv32k_3:
move.b d3,(a1)+
move.w d2,d3 *G
and.w d5,d3
rol.w #6,d3
beq conv32k_4
or.w d7,d3
conv32k_4:
move.b d3,(a1)+
move.w d2,d3 *R
and.w d6,d3
ror.w #5,d3
beq conv32k_5
or.w d7,d3
conv32k_5:
move.b d3,(a1)+
dbra.w d1,conv32k_2
move.w a5,d1 *半端分クリア
beq conv32k_7
subq.w #1,d1
conv32k_6:
clr.b (a1)+
dbra.w d1,conv32k_6
conv32k_7:
suba.l a4,a1
dbra.w d0,conv32k_1
rts
*****************************************************************
* パレット変換 *
*****************************************************************
pal_set:
movem.l d0-d7/a0-a1,-(sp)
movea.l pal_addr(a6),a0
movea.l gr_addr2(a6),a1
subq.w #1,d0 *ループ数-1
move.w #%00000000_01111100,d4 *マスクデータ
move.w #%11100000_00000011,d5
move.w #%00011111_00000000,d6
move.w #%00000000_00000111,d7
pal_set1:
move.w (a0)+,d1 *B
move.w d1,d2 *G
move.w d1,d3 *R
and.w d4,d1 *B
rol.w #1,d1
beq pal_set2
or.w d7,d1
pal_set2:
and.w d5,d2 *G
rol.w #6,d2
beq pal_set3
or.w d7,d2
pal_set3:
and.w d6,d3 *R
ror.w #5,d3
beq pal_set4
or.w d7,d3
pal_set4:
move.b d1,(a1)+
move.b d2,(a1)+
move.b d3,(a1)+
clr.b (a1)+
dbra.w d0,pal_set1
movem.l (sp)+,d0-d7/a0-a1
rts
*****************************************************************
* パレットセーブ *
*****************************************************************
pal_save:
movea.l gr_addr2(a6),a5
move.l d0,d6
bsr file_write
rts
*****************************************************************
* 1ラインのバイト数を求める *
*****************************************************************
line_byte_set:
move.w iro(a6),d0
cmp.w #8,d0
bcs lb_get4
beq lb_get8
bhi lb_get24
lb_get4:
move.w yoko(a6),d0
addq.w #7,d0
lsr.w #1,d0
and.w #$fffc,d0
move.w d0,line_byte(a6)
bra line_byte_set9
lb_get8:
move.w yoko(a6),d0
addq.w #3,d0
andi.w #$fffc,d0
move.w d0,line_byte(a6)
bra line_byte_set9
lb_get24:
move.w yoko(a6),d0
move.w d0,d1
add.w d1,d1
add.w d1,d0
addq.w #3,d0
and.w #$fffc,d0
move.w d0,line_byte(a6)
line_byte_set9:
rts
*****************************************************************
* メモリチェック *
*****************************************************************
mem_chk:
move.w line_byte(a6),d0
mulu.w tate(a6),d0
add.l fi_size(a6),d0
cmp.l buff_size(a6),d0
bls mem_chk9
adda.l tim_size(a6),a2 *変換できないぶん進める
st skip_flg(a6)
mem_chk9:
rts
*****************************************************************
* BMPヘッダの書き込み *
*****************************************************************
head_create:
bsr head_set *ヘッダデータの設定
lea.l arg2(a6),a0 *ヘッダ作成
bsr file_create
lea.l head_buff(a6),a5 *ヘッダ書き込み
moveq.l #54,d6
bsr file_write
rts
*****************************************************************
* ヘッダデータの設定 *
*****************************************************************
head_set:
lea.l head_buff(a6),a0 *バッファの先頭
move.w #'BM',f_type(a0) *ファイル識別子
move.w tate(a6),d0 *ファイルサイズ(TATExline_byte+ヘッダサイズ)
mulu.w line_byte(a6),d0
move.l d0,d1
add.l head_size(a6),d0
bsr i_to_m
move.l d0,f_size(a0)
clr.w f_reserved1(a0) *予備1
clr.w f_reserved2(a0) *予備2
move.l head_size(a6),d0 *ファイル先頭からイメージデータへのオフセット
bsr i_to_m
move.l d0,f_offbits(a0)
move.l #$28000000,win3_size(a0) *ヘッダサイズ(12:OS/2 V1, 40:Win3, 64:OS/2 V2)
move.w yoko(a6),d0 *横サイズ
ext.l d0
bsr i_to_m
move.l d0,win3_width(a0)
move.w tate(a6),d0 *縦サイズ
ext.l d0
bsr i_to_m
move.l d0,win3_height(a0)
move.w #$0100,win3_planes(a0) *使用プレーン数
move.w iro(a6),d0 *使用bit数(1:2色,4:16色,8:256色,24:16777216色)
ror.w #8,d0
move.w d0,win3_bitcount(a0)
move.l #0,win3_comp(a0) *圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
move.l d1,d0 *イメージデータのサイズ
bsr i_to_m
move.l d0,win3_size_image(a0)
* clr.l win3_xpels_pm(a0) *X方向のディスプレイ分解能
* clr.l win3_ypels_pm(a0) *Y方向のディスプレイ分解能
move.l #$130B0000,win3_xpels_pm(a0) *X方向のディスプレイ分解能
move.l #$130B0000,win3_ypels_pm(a0) *Y方向のディスプレイ分解能
clr.l win3_clr_used(a0) *色変換テーブルの大きさ
clr.l win3_clr_imp(a0) *重要な色の数
rts
i_to_m:
ror.w #8,d0
swap.w d0
ror.w #8,d0
rts
*****************************************************************
* セーブするファイル名を作る *
*****************************************************************
save_name_set:
movem.l d0/a0-a1,-(sp)
movea.l nameichi(a6),a0
lea.l filbuf(a6),a1
lea.l 30(a1),a1
bsr strcpy
movea.l nameichi(a6),a0
moveq.l #15-1,d0
sn_get0:
cmp.b #".",(a0)+
beq sn_get1
dbra.w d0,sn_get0
addq.l #1,a0
sn_get1:
addq.l #2,a0
move.l a0,edaichi(a6)
move.b #"0",-3(a0)
move.b #"0",-2(a0)
move.b #"0",-1(a0)
move.b #".",(a0)
move.b #"B",1(a0)
move.b #"M",2(a0)
move.b #"P",3(a0)
move.b #0,4(a0)
movem.l (sp)+,d0/a0-a1
rts
*****************************************************************
* ファイル名の枝番をセットする *
*****************************************************************
setdec:
addq.w #1,edaban(a6)
move.w edaban(a6),d0 *枝番を転送
andi.l #$0000FFFF,d0 *上位ワードをクリア
movea.l edaichi(a6),a0 *転送位置
setdec0:
divu.w #10,d0 *d0.lを10で割る
swap.w d0 *上位ワードと下位ワードを交換
addi.w #'0',d0 *0~9 → '0'~'9'
move.b d0,-(a0) *1桁格納
clr.w d0 *次の除算に備える
swap.w d0 *上位ワードと下位ワードを交換
bne setdec0
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0
bmi open_err
move.w d0,in_file(a6)
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a5,-(sp) *バッファアドレス
move.w in_file(a6),-(sp)
DOS _READ
lea 10(sp),sp
tst.l d0
bmi read_err
cmp.l d6,d0
bne read_err
rts
*****************************************************************
* ファイル作成 *
*****************************************************************
file_create:
move.w #$20,-(sp) *ファイルCREATE
move.l a0,-(sp)
DOS _CREATE
addq.l #6,sp
tst.l d0
bmi create_err
move.w d0,out_file(a6)
rts
*****************************************************************
* ディスクに書き込む *
*****************************************************************
file_write:
move.l d6,-(sp) *データサイズ
move.l a5,-(sp) *バッファアドレス
move.w out_file(a6),-(sp)
DOS _WRITE
lea.l 10(sp),sp
tst.l d0
bmi write_err
cmp.l d6,d0
bne write_err
rts
*****************************************************************
* バッファ確保 *
*****************************************************************
buf_get:
pea.l -1.w *確保出来る最大サイズを取得
DOS _MALLOC
addq.l #4,sp
andi.l #$00ffffff,d0
move.l d0,d1
move.l d0,-(sp)
DOS _MALLOC
addq.l #4,sp
tst.l d0
bmi no_buff
move.l d0,buff_addr(a6) *バッファアドレス
move.l d1,buff_size(a6) *バッファサイズ
rts
*****************************************************************
* バッファ開放 *
*****************************************************************
buf_free:
pea.l buff_addr(a6) *バッファ開放
DOS _MFREE
addq.l #4,sp
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
tst.w file_cnt(a6) *処理したファイルは0個か
bne file_cnt_chk1 *違う
lea.l no_file_mes(pc),a0
bsr mesput
file_cnt_chk1:
rts
*****************************************************************
* '検索中'を表示 *
*****************************************************************
kensaku_prt:
lea.l crlf_mes(pc),a0
bsr mesput
lea.l filbuf(a6),a0
lea.l 30(a0),a0
bsr mesput
lea.l kensaku_mes(pc),a0
bsr mesput
rts
*****************************************************************
* セーブファイル名&サイズを表示する *
*****************************************************************
name_prt:
movem.l d0/a0-a1,-(sp)
lea.l prt_buff(a6),a0 *表示バッファ初期化
moveq.l #96-1,d0
name_prt1:
move.b #SPACE,(a0)+
dbra.w d0,name_prt1
clr.b (a0)+
lea.l prt_buff(a6),a0 *表示バッファ
movea.l nameichi(a6),a1 *ファイル名
bsr strcpy
move.b #SPACE,(a0)
lea.l prt_buff(a6),a0 *位置合わせ
lea.l 22(a0),a0
move.b #"(",(a0)+ *画像サイズ
move.w yoko(a6),d0
bsr dec_set
move.b #SPACE,(a0)+
move.b #"*",(a0)+
move.w tate(a6),d0
bsr dec_set
move.b #")",(a0)+
move.w iro(a6),d0 *bit数
bsr dec_set
lea.l bit_mes(pc),a1
bsr strcpy
move.w tate(a6),d0 *バイト数
mulu.w line_byte(a6),d0
add.l head_size(a6),d0
bsr dec_set2
lea.l byte_mes(pc),a1
bsr strcpy
tst.b skip_flg(a6) *メモリが足りない時
beq name_prt2
lea.l no_buff_mes(pc),a1
bsr strcpy
name_prt2:
lea.l crlf_mes(pc),a1
bsr strcpy
lea.l prt_buff(a6),a0
bsr mesput
movem.l (sp)+,d0/a0-a1
rts
dec_set:
move.l a0,-(sp)
ext.l d0
lea.l dec_buf(a6),a0
bsr bin2dec
bsr zero_keshi
move.l (sp)+,a0
lea.l dec_buf(a6),a1
addq.l #6,a1
bsr strcpy
rts
dec_set2:
move.l a0,-(sp)
lea.l dec_buf(a6),a0
bsr bin2dec
bsr zero_keshi
move.l (sp)+,a0
lea.l dec_buf(a6),a1
bsr strcpy
rts
*****************************************************************
* 2進=>10進 *
* d0 変換元の数値 a0 変換後の格納アドレス *
*****************************************************************
bin2dec:
movem.l d0-d3/a0-a1,-(sp)
moveq.l #10-1,d1
lea.l exp_tbl(pc),a1
bin2dec0:
clr.b d2
move.l (a1)+,d3
bin2dec1:
or d3,d3
sub.l d3,d0
bcs bin2dec2
addq.b #1,d2
bra bin2dec1
bin2dec2:
add.l d3,d0
add.b #'0',d2
move.b d2,(a0)+
dbra d1,bin2dec0
movem.l (sp)+,d0-d3/a0-a1
rts
exp_tbl:
.dc.l 1000000000
.dc.l 100000000
.dc.l 10000000
.dc.l 1000000
.dc.l 100000
.dc.l 10000
.dc.l 1000
.dc.l 100
.dc.l 10
.dc.l 1
*****************************************************************
* ファイルサイズの頭にある'0'を消す *
*****************************************************************
zero_keshi:
lea.l dec_buf(a6),a0
moveq.l #9-1,d0
zero_keshi0:
cmp.b #'0',(a0)
bne zero_keshi9
move.b #SPACE,(a0)+
dbra.w d0,zero_keshi0
zero_keshi9:
rts
*****************************************************************
* ファイル名エラー *
*****************************************************************
name_er:
lea.l in_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メモリが足りない *
*****************************************************************
no_buff:
lea.l arg1(a6),a0
bsr mesput
lea.l no_buff_mes(pc),a0
bsr mesput
lea.l crlf_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg1(a6),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg1(a6),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 出力パス名エラー *
*****************************************************************
out_name_err:
lea.l out_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル作成エラー *
*****************************************************************
create_err:
lea.l arg2(a6),a0
bsr mesput
lea.l create_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル書き込みエラー *
*****************************************************************
write_err:
lea.l arg2(a6),a0
bsr mesput
lea.l write_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
IOCS _MS_INIT *キーバッファクリア
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w #-1,-(sp)
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b 'TIM to BMP converter V0.01 by A.MUKAWA',CR,LF
.dc.b '機能:PSベタのTIMファイルを Win標準のBMPファイルにコンバートします',CR,LF
.dc.b '用法:TIM2BMP ファイル名 [セーブ先パス]',CR,LF
.dc.b CR,LF
.dc.b 'セーブされるファイル名は、元のファイル名(最大15文字)の後ろに',CR,LF
.dc.b '3桁の数字が付いた、拡張子が"BMP"のファイル名になります。',CR,LF
.dc.b '8文字以上になる事もあるので注意して下さい。',CR,LF
.dc.b 0
in_mes:
.dc.b '入力ファイル',0
out_mes:
.dc.b '出力先パス',0
name_er_mes:
.dc.b '名の指定に間違いがあります!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
create_er_mes:
.dc.b ' が作れません!',CR,LF,0
write_er_mes:
.dc.b ' の書き込みエラーが発生しました!',CR,LF,0
no_file_mes:
.dc.b 'TIMファイルが見つかりませんでした!',CR,LF,0
henkan_mes:
.dc.b ' 変換中',0
syuryo_mes:
.dc.b ' 終了!',0
kensaku_mes:
.dc.b ' を検索中',CR,LF,0
no_buff_mes:
.dc.b ' の変換に必要なメモリがありません!',0
byte_mes:
.dc.b 'byte',0
bit_mes:
.dc.b 'bit',0
crlf_mes:
.dc.b CR,LF,0
func_off_mes:
.dc.b $1b,$5b,$3e,$31,$68,0
dext:
.dc.b '.TIM',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.TIM',0
*****************************************************************
* ワークエリア *
*****************************************************************
.offset 0
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg1:
.ds.b 256 *入力ファイル名バッファ
arg2:
.ds.b 256 *出力ファイル名バッファ
cpathbuf
.ds.b 65 *カレントパス名バッファ
spathbuf
.ds.b 65 *セーブ先パス名バッファ
.even
head_buff:
.ds.b 54 *BMPヘッダバッファ
head_size:
.ds.l 1 *ヘッダサイズ
buff_addr:
.ds.l 1 *画像読み込みバッファアドレス
buff_size:
.ds.l 1 *画像読み込みバッファサイズ
pal_addr:
.ds.l 1 *パレットアドレス
gr_addr1:
.ds.l 1 *変換前画像アドレス
gr_addr2:
.ds.l 1 *変換後画像アドレス
fi_size:
.ds.l 1 *ファイルサイズ
tim_size:
.ds.l 1 *TIMサイズ
iro:
.ds.w 1 *使用bit数
yoko:
.ds.w 1 *画像の横(X)サイズ
tate:
.ds.w 1 *画像の縦(Y)サイズ
line_byte:
.ds.w 1 *1ラインのバイト数
line_cnt:
.ds.w 1
file_cnt:
.ds.w 1
nameichi:
.ds.l 1
edaichi:
.ds.l 1
edaban:
.ds.w 1
in_file:
.ds.w 1
out_file:
.ds.w 1
dec_buf:
.ds.b 10+1
prt_buff:
.ds.b 96+1
skip_flg:
.ds.b 1
.even
WORK_SIZE:
.bss
.even
work:
.ds.b WORK_SIZE
my_stack:
.ds.l 1024
mysp:
.end start